#pragma once
#include <memory>
#include "Table.h"
#include "Sofa.h"
#include "Chair.h"

#include "Logistics.h"

class AbstractFactory {
public:
	virtual ~AbstractFactory() {}

	virtual std::shared_ptr<AbstractChair> CreateChair()const = 0;
	virtual std::shared_ptr<AbstractSofa> CreateSofa()const = 0;
	virtual std::shared_ptr<AbstractTable> CreateTable()const = 0;

	virtual std::string CreateFurniture(std::shared_ptr< AbstractLogistics> log);
};

class Art_DecoFactory :public AbstractFactory {
public:
	std::shared_ptr<AbstractChair> CreateChair()const override;
	std::shared_ptr<AbstractSofa> CreateSofa()const override;
	std::shared_ptr<AbstractTable> CreateTable()const override;
};

class VictorianFactory :public AbstractFactory {
public:
	std::shared_ptr<AbstractChair> CreateChair()const override;
	std::shared_ptr<AbstractSofa> CreateSofa()const override;
	std::shared_ptr<AbstractTable> CreateTable()const override;
};

class ModernFactory :public AbstractFactory {
public:
	std::shared_ptr<AbstractChair> CreateChair()const override;
	std::shared_ptr<AbstractSofa> CreateSofa()const override;
	std::shared_ptr<AbstractTable> CreateTable()const override;
};